// 浅拷贝和深拷贝的区别：

// 浅拷贝 ： 只是将数据中所有的数据引用下来，依旧指向同一个存放地址，拷贝之后的数据修改之后，
// 也会影响到原数据的中的对象数据

// 深拷贝： 将数据中所有的数据拷贝下来，对拷贝之后的数据进行修改不会影响到原数据

//递归实现深拷贝
// 实现思路

// 1.将要拷贝的数据 obj 以参数的形式传参

// 2.声明一个变量 来储存我们拷贝出来的内容

// 3.判断 obj 是否是引用类型数据，如果不是，
// 则直接赋值即可（ 可以利用 obj instanceof Type 来进行判断），

// 4.由于用 instanceof 判断array 是否是object的时候，返回值为true,
// 所以我们在判断的时候，直接判断obj 是否是Array 就可避免这个问题

// 5.根据判断的不同类型，再给之前的变量赋予不同的类型： [ ] : { }

// 6.循环obj 中的每一项，如果里面还有复杂数据类型，则直接利用递归再次调用copy函数

// 7.最后 将 这个变量 return 出来即可
var obj = {
  //原数据，包含字符串、对象、函数、数组等不同的类型
  name: "test",
  main: {
    a: 1,
    b: 2,
  },
  fn: function () {},
  friends: [1, 2, 3, [22, 33]],
};

function copy(obj) {
  let newobj = null;
  //声明一个变量用来储存拷贝之后的内容
  //判断数据类型是否是复杂类型，如果是则调用自己，再次循环，如果不是，直接赋值即可，
  //由于null不可以循环但类型又是object，所以这个需要对null进行判断
  if (typeof obj == "object" && obj !== null) {
    //声明一个变量用以储存拷贝出来的值,根据参数的具体数据类型声明不同的类型来储存
    newobj = obj instanceof Array ? [] : {};
    //循环obj 中的每一项，如果里面还有复杂数据类型，则直接利用递归再次调用copy函数
    for (var i in obj) {
      newobj[i] = copy(obj[i]);
    }
  } else {
    newobj = obj;
  }
  return newobj; //函数必须有返回值，否则结构为undefined
}

var obj2 = copy(obj);
obj2.name = "修改成功";
obj2.main.a = 100;
console.log(obj, obj2);
